梦入琼楼寒有月,行过石树冻无烟

Laravel 表单验证

在Laravel之中提供了很多种不同的方法来验证表单所传入的数据,在默认的情况下Laravel会使用基本的控制器类validatesRequest所定义的,该类提供了各种强大的验证规则来验证所传入的HTTP请求:

表单传输方式

通常我们会验证表单的传输方式分别为POST或是GET,对此Laravel为我们提供了一个isMethod方法来进行验证,我们可以在路由中进行也可在控制器中进行,本文为了简约流程所以使用路由进行:

web.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
use Illuminate\Http\Request;

Route::get('/', function () {
return view('welcome');
});

Route::get('/input', function () {
return view(('input'));
});

Route::post('/input/test', function (Request $request) {
if ($request->isMethod('post')) {
echo "yes";
} else {
echo "no";
}
});

input.blode.php

1
2
3
4
5
6
7
8
9
10
11
12
<html>
<head>
<title>This is be Input up</title>
</head>
<body>
<form action="/input/test" method="post">
<input type="hidden" name="_token" value="<?php echo csrf_token()?>">
Username:<input type="text" name="username" />&nbsp;
<input type="submit" value="up">
</form>
</body>
</html>

验证规则

控制器

通常在原生态的PHP语言之中,验证规则通常会使用正则表达式等方式,但是由于正则表达式不宜于阅读,所以Laravel为我们提供了一种更好的validate方法,主要分为制定规则、错误回显、表单命名等。如果传入的请求参数未通过指定的验证规则,Laravel 则会将用户重定向到之前的位置中,并且将错误信息存储至 session中。

变量由 ```Iliumineat\View\middleware\ShareErrorsFormSession```中间件绑定至视图当中,当这个中间件被使用会就可一在视图获取到 ```$error```变量(在理论上来将 $error 可以被安全的使用)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

```php
// input.blode.php
<html>
<head>
<title>This is be Input up</title>
</head>
<body>
<!--
这里主要用于返回错误信息
-->
@if($errors->any())
<div class="alert alert-danger">
@foreach($errors->all() as $error)
<p>{{$error}}</p>
@endforeach
</div>
@endif

<form action="/input/test" method="post">
@csrf
<input type="hidden" name="_token" value="<?php echo csrf_token()?>">
Username:<input type="text" name="username" />&nbsp;
<input type="submit" value="up">
</form>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// TestController
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class TestController extends Controller
{
public function store(Request $request) {
print_r($request->all());
$this->validate($request, [
/*
* 用于定义规则
*/
'username'=>'required|max:1|alpha',
], [
/*
* |- 大类
* | |- required 必填
* | |- max 最大
* | |- min 最小
* | |- integer 数值
*/
'required' => ':attribute 必填',
'max' => ':attribute 长度不能大于一个字符',
'alpha' => ':attribute 只能包含字母',
], [
/*
* |- 用于给input表单进行命名,时候后会输出
* | |-"账号名称 必填"
* |- 如果不使用则会输出
* | |- username 账号名称
*/
'username' => '账号名称',
]);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 web.php
<?php

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
use Illuminate\Http\Request;

Route::get('/', function () {
return view('welcome');
});

Route::get('/input', function () {
return view(('input'));
});

Route::post('/input/test', 'TestController@store');

返回错误信息

返回全部错误信息

如果传入的请求参数未通过指定的验证规则,Laravel 则会将用户重定向到之前的位置中,并且将错误信息存储至 session中。

$error 变量由 Iliumineat\View\middleware\ShareErrorsFormSession中间件绑定至视图当中,当这个中间件被使用会就可一在视图获取到 $error变量(在理论上来将 $error 可以被安全的使用)

1
2
3
4
5
6
7
@if($errors->any())
<div class="alert alert-danger">
@foreach($errors->all() as $error)
<p>{{$error}}</p>
@endforeach
</div>
@endif

在上述的 code 中,主要可以返回全部的错误信息,假设表单1、表单2为通过验证规则,则会将这两个表单的错误信息显示在一个标签之中。

返回单个错误信息
1
2
3
4
@error('titles')
<p>{{$message}}</p>
@enderror
<textarea class="issue-textarea @error("titles") is issue-orss @enderror" rows="1" name="titles"></textarea>

返回单个信息有好处也有缺点,好处就是我们可以通过返回的单个信息来设置显示 如果该表单为通过验证时的样式,而缺点则是 需要一个一个的写

验证表单请求

创建一个请求类

面对更繁杂的表单验证,可以通过创建一个 表单请求 来处理表单验证的逻辑,该请求类是包含验证是的验证逻辑,通常可以通过下述 Artisan 命令进行创建。

1
php artisan make:request StoreTestPost

创建之后该请求类将会存放在 app/Http/Requests/ 目录下,我们分别可以通过 authorize、rules、messages、attributes 来对请求类进行一系列的设置和操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StoreTestPost extends FormRequest
{
/**
* 确定用户是否有权提出此请求。
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}

/**
* 获取应用于请求的验证规则。
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'test' => 'required',
];
}

/*
* 为规则写入提示信息
* Write prompt information for rules
*/
public function messages() {
return [
'required' => ':attribute必填',
];
}

/*
* 为表单设置名称
* Set a name for the form
*/
public function attributes()
{
return [
'test' => "测试",
];
}
}

需要注意的是我们还需要修改当前的控制器,将请求改为表单请求:

1
2
3
4
5
6
7
8
9
10
/**
* Store a newly created resource in storage.
*
* @param StoreTestPost $request
* @return \Illuminate\Http\Response
*/
public function store(StoreTestPost $request)
{
//
}
1
2
//web.php
Route::post('/upload',"PostController@store");
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@if($errors->any())
<div>
@foreach($errors->all() as $error)
<p>{{$error}}</p>
@endforeach
</div>
@endif
{{--inbar.blade.php--}}
<form action="/upload" method="post" enctype="multipart/form-data">
@csrf
<input type="hidden" name="_token" value="<?php echo csrf_token()?>">
<input type="text" name="test">
<button type="submit">Up File</button>
</form>

当前语言下的错误提示信息

如果你的需求只是简单的想将 表单所提示的错误信息 改成你想要的,那么通过编辑 resources/lang/en/validation.php 文件也是一个非常好的选择,除此之外它还可以通过attributes支持自定义的表单名称。

Laravel 目前支持的验证规则

DA FA DA
accepted 验证必须是yes\on\1\true 可以运用在服务条款
active_url 验证字段是有效的A或aa记录
after:date 必须是指定日期之后的值
after_or_equal:date 验证字段是指定日期之后与此日期相同的值
alpha 验证必须是由字母组成的数据
alpha_dash 允许包含字母、数字以及破折号和下划线的数据
alpha_num 必须完全是字母或数字的数据
array 验证数据是一个php数组
bail 在第一次验证失败后停止验证规则
before:date 这个验证的数据必须是指定的日期值
before_or_equal:date 验证数据必须是在指定日期之前或相同的日期
between:min,max 安正数据的大小必须在min和max之间
boolean 验证数据必须可以转换为boolean类型 接受true、false、1、0
confirmed 验证数据必须具有匹配字段 验证字段为password,输入必须存在匹配的password字段
date 根据php函数,验证必须是有效的日期
date_equals:date 验证数据必须等于指定日期
date_format:format 验证数据必须匹配指定的日期格式
different:field 验证的数据必须与field值不同
digits:value 验证数据必须为numeric 且必须具有准确长度的value
dimensions u验证文件必须是图片且比例符合规则 min_width:x,min_height=n
ditinct 验证数组时数据不允许有任何重复
email 验证数据符合e-mail地址格式
ends_with:foo,bar 验证数据必须是指定值内的结尾
exists:table,column 验证数据必须存在指定的数据库表中
file 验证数据必须是成功上传的文件
filled 验证数据的存在时不可为空
ge:field 验证数据必须大于指定的field 两个数据必须是相同的类型
gte:field 验证数据必须大于或等于指定的fileld
image 验证数据必须为图片
in:foo,bar 雅正数据必须包含在指定的值列表中
in_array:anotherfield.* 验证数据必须存在与另一个字段antherfield值中
integer 验证数据必须时整数
ip 验证数据必须是ip地址 ip
ipv4 验证数据必须是ipv4地址 ip
ipv6 验证数据必须是ipv6地址 ip
json 验证数据必须是有效的json字符串
lt:field 验证数据必须是指定的field
lte_field 验证数据必须小于或等于指定的数据
max:value 验证数据必须小于或等于给定的值
mimetypes:text/plain 验证文件必须具备列出的其中一个扩展匹配的MIME类型
mimes:foo,bar 验证文件必须是具有列出其中一个扩展名对应的mime类型 mimes:jpeg,png
min:value 验证数据必须具有最小值
not_in:foo,bar 验证数据不能包含在指定的值列表中
not_regex:pattern 验证数据必须与值idngd正则表达式不匹配
nullable 验证数据可以为null
memeric 验证数据必须为数值
password 验证中的数据必须与经过身分验证的用户密码进行匹配
present 验证数据必须存在输入的数据中 可以为空?
regex:pattern 验证数据必须与指定的正则表达式进行匹配
required 验证的字段必须存在于输入的数据中,而不是为空 值为null、值为空字符串、无路径的上传文件
required_if:anotherfield,value_one,value_two 如果其他数据为任意一值,此验证数据必须存在且不为空
required_unless:anotherfield,value 如果数据不等于任意值,此验证数据必须存在且不可为空
required_with:foo,bar 在其他任意指定数据出现时,验证的数据必须存在且不可为空
required_with_all:foo,bar 只有在任意一段数据全部出现时,验证数据才必须存在且不为空
reqrequired_without:foo,bar 在其他数据不出现时,验证数据才存在且不可为空
required_without_all:foo,bar 只有在其他指定数据字段全部不出现时,验证数据才可存在且不可为空
same:field 验证数据必须与指定数据相匹配
size:value 验证数据必须指定值大小一致
starts_with:foo,bar 验证数据必须以指定值之一开头
string 验证数据必须是一个字符串
timezone 验证数据必须符合php函数所定义的有效时区标识 timezoune_identifiers_list
unique:table,column,except,idColumn 验证数据在指定数据库表中是唯一的
⬅️ Go back